package study.cdc.debezium.support.debezium;

import io.debezium.engine.DebeziumEngine;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.SmartLifecycle;
import org.springframework.util.Assert;

/**
 * 引擎的启动和关闭正好契合 Spring Bean 的生命周期
 */
@Slf4j
public class DebeziumServer implements InitializingBean, SmartLifecycle {

    private volatile boolean running = false;

    @Setter
    private DebeziumEngine<?> engine;

    @Override
    public void afterPropertiesSet() throws Exception {
        log.info(">>>>>>>>>>");
        log.info(">>>>>>>>>> afterPropertiesSet");
        log.info(">>>>>>>>>>");
        Assert.notNull(engine, "debezium engine must not be null");
    }

    /**
     * （1）我们主要在该方法中启动任务或者其他异步服务，比如开启 MQ 接收消息
     * （2）当上下文被刷新（所有对象已被实例化和初始化之后）时，将调用该方法，
     * 默认生命周期处理器将检查每个 SmartLifecycle 对象的 isAutoStartup() 方法返回的布尔值。
     * 如果为true，则该方法会被调用，而不是等待显式调用自己的 start() 方法。
     */
    @Override
    public void start() {
        log.info(">>>>>>>>>>>>>>> start");
        Thread t = new Thread(engine, "debezium-engine-thread");
        t.start();
        running = true;
    }

    @Override
    public void stop() {
        if (engine != null) {
            try {
                engine.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        //
        running = false;
    }

    @Override
    public boolean isRunning() {
        return running;
    }
}
